1.15 Ein zweites Textfeld
 
Nun gibt es noch einen »Schlitz«, in den der Benutzer sein Geld einwirft, natürlich nur übertragen gesprochen. Ich hätte gerne ein zweites Textfeld, in das der Benutzer den Geldbetrag eingeben kann. Es wird »txtGeld« genannt, der Text ist natürlich leer, das heißt, er wird gelöscht. Darunter befindet sich ein Label mit dem beschreibenden Text »Einwurf mind. 1 E« - schließlich muss der Benutzer wissen, was der Kaffee kostet.
Abbildung 1.25
Das Textfeld für den Geldeinwurf
Nun gibt es verschiedene Varianten: Der Benutzer wirft etwas Falsches ein (schwedische Kronen, britische Pfund), er wirft zu wenig ein, er wirft genau einen Euro ein oder mehr als einen Euro. Im ersten Fall wird er höflich darauf aufmerksam gemacht, dass er kein »korrektes« Geld eingeworfen, das heißt keine Zahl eingegeben hat. Im zweiten Fall bekommt er einen Hinweis, dass er noch etwas Geld einwerfen muss. Falls er mehr als einen Euro eingegeben hat, so erhält er natürlich sein Wechselgeld zurück.
Dazu brauchen wir - wie könnte es anders sein - eine neue Verzweigung. Hinter der Ok-Schaltfläche befindet sich folgender Code:
If txtName.Text = "" Then
MessageBox.Show _
("Hey, Benutzer, dein Name fehlt! ")
txtName.Select()
Else
MessageBox(Achtung: " & txtName.Text & _
"Jetzt gibt es Kaffee!")
End If
Man könnte nun im Sonst-Zweig noch einmal überprüfen, ob der Betrag korrekt ist. Dazu muss man eine Verzweigung in einer Verzweigung schachteln. Das ist zwar möglich und korrekt, aber bei zu vielen Ebenen kann der Code unübersichtlich werden. Deshalb schlage ich folgende Variante vor. Hat der Benutzer keinen Namen eingegeben, dann erhält er einen Hinweis und: Ende! Das sieht so aus:
If txtName.Text = "" Then
MessageBox.Show _
("Hey, Benutzer, dein Name fehlt!")
txtName.Select()
Exit Sub
End If
MessageBox.Show _
(Achtung: " & txtName.Text & _
"Jetzt gibt es Kaffee! ")
Die Anweisung Exit Sub sorgt dafür, dass das Programm beendet wird. Achtung: Die Maske wird nicht geschlossen, es wird nur nichts mehr ausgeführt, was sich weiter unten befindet. Es kann nun überprüft werden, ob es sich bei der Eingabe um eine Zahl handelt. Dazu wird eine Funktion benötigt. Sie heißt IsNumeric(). Das Ergebnis dieser Funktion ist entweder »Wahr« oder »Falsch«. Also wird geschrieben:
If IsNumeric(txtGeld.Text) = False Then
MessageBox("Bitte nur Zahlen eingeben! ")
Exit Sub
End If
Die Funktion IsNumeric verlangt also eine Zeichenkette und überprüft, ob es sich um eine gültige Zahl handelt. Dies ist wichtig, wenn mit der Zahl weitergerechnet wird, denn angenommen, der Benutzer hat »DREI« eingegeben, dann »weiß« das Programm nicht, was es mit diesem Wert tun soll. Das Ergebnis der Funktion ist also immer »Wahr« oder »Falsch« beziehungsweise »True« oder »False«. Es gibt Programmierer, die schreiben statt
If IsNumeric(txtGeld.Text) = True Then
den Befehl
If IsNumeric(txtGeld.Text) Then
Das würde auch genügen. Für unsere Falsch-Auswertung könnte man auch schreiben:
If Not IsNumeric(txtGeld.Text) Then
Das Verknüpfungselement Not dreht den Wahrheitswert um, er macht also aus »Falsch« »Wahr«. Damit haben wir wieder die Variante von oben. Leider kann man den Typ nicht mit folgenden Eigenschaften abfragen:
txtGeld.GetType. Name
txtGeld.GetType.FullName
Abbildung 1.26
Eine falsche Eingabe
Da ein Textfeld immer eine Zeichenkette zurückgibt, wird die Antwort immer »System.String« oder »String« lauten.
Nun zum zweiten Fall. Der Benutzer hat eine gültige Zahl eingetragen, aber eben nicht genug für den Kaffee. Dann wird überprüft:
ElseIf txtGeld.Text < 1 Then
MessageBox("Hey, es fehlt noch Knete! ")
Exit Sub
Basic zeigt den Vergleich
txtGeld.Text < 1
als fehlerhaft an. Warum? Die Erklärung lautet:
Eine implizite Konvertierung von String in Double ist nicht erlaubt.
Was heißt das? Die Eigenschaft txtGeld.Text liefert beispielsweise 0,8. Nein: nicht 0,8, sondern »0,8«. Das bedeutet, dass die Zahl eine Zeichenkette ist. Man kann mit ihr nicht rechnen und man kann sie nicht mit einer anderen Zahl vergleichen. Woher kommt das? Das Textfeld als Objekt gibt immer nur Zeichenketten zurück, unabhängig davon, ob es sich dabei um Texte (also Buchstaben) oder Zahlen (also Ziffern) handelt. Für die Umwandlung sind wir verantwortlich. Also benötigen wir eine Funktion, welche die Zeichenkette »0,8« in die Zahl 0,8 umwandelt. Sie heißt CDbl(). Das »C« steht für »convert« und »Dbl« für »Double«. Das Gleiche könnte die Methode Convert.ToDouble leisten. Modifizieren wir die obige Zeile in:
ElseIf CDbl(txtGeld.Text) < 1 Then
MessageBox.Show("Hey, es fehlt noch Knete!")
oder
ElseIf Convert.ToDouble(txtGeld.Text) < 1 Then
MessageBox.Show("Hey, es fehlt noch Knete!")
Sie sehen schon, dass Datentypen und Funktionen eine wichtige Rolle beim Programmieren spielen. Hier ein Überblick über die Konvertierungsfunktionen von VB.NET:
Tabelle 1.5
Die Liste der Konvertierungsfunktionen
| Funktion (VB)
|
Funktion
|
konvertiert in
|
| Cbool
|
Convert.ToBoolean
|
Boolean
|
| Cbyte
|
Convert.ToByte
|
Byte
|
| Cchar
|
Convert.ToChar
|
Char
|
| Cdate
|
Convert.ToDateTime
|
Date
|
| CDbl
|
Convert.ToDouble
|
Double
|
| Cdec
|
Convert..ToDecimal
|
Decimal
|
| Cint
|
Convert.ToInteger
|
Integer
|
| CLng
|
|
Long
|
| Cobj
|
|
Object
|
| CSng
|
Convert.ToSingle
|
Single
|
| CStr
|
Convert.ToString
|
String
|
Es gibt noch eine Funktion, die das Gleiche leistet wie die Konvertierungsfunktionen. Sie lautet: CType und verlangt zwei Werte: Die Zahl oder den Text, welche konvertiert werden soll, und den Typ, in welchen umgewandelt wird. Also beispielsweise:
ElseIf CType(txtGeld.Text, Double) < 1 Then
Die Typen, die verwendet werden dürfen, stehen in der oberen Tabelle. Übrigens kann mit der Methode GetType herausgefunden werden, um welchen Datentyp es sich handelt. Wenn Sie ihn anzeigen lassen möchten, dann vergessen Sie das ToString nicht, also:
MessageBox.Show("i.GetType.ToString")
Zurück zu unserem Beispiel. Bei einer fehlerhaften Eingabe soll in das Feld zurückgesprungen werden - am schönsten wäre es, wenn der Inhalt markiert würde. Statt
txtGeld.Select()
wird geschrieben:
txtGeld.SelectAll()
Exit Sub
Während Select() nur den Cursor hineinsetzt, markiert SelectAll() den gesamten Inhalt der TextBox.
Die Ungleichheitszeichen sind bekannt, oder? Folgende Zeichen stehen uns in VB.NET zur Verfügung: =, <, >, <= und >=. Das gilt natürlich nur für Zahlen. Man kann auch Texte miteinander vergleichen - darüber werden wir noch reden.
Doch zuerst wird das Wechselgeld berechnet:
ElseIf CDbl(txtGeld.Text) > 1 Then
MessageBox.Show _
("Hey, du bekommst noch Knete raus.")
Schön wäre natürlich auch, wenn ich sehen könnte, wie viel Geld ich noch bekomme. Na, das Rückgabegeld ist doch txtGeld.Text - 1. Nein, das stimmt nicht ganz, denn rechnen kann man nur, wenn der Text in eine Zahl verwandelt wurde. Also:
CDbl(txtGeld.Text) - 1
Das ist korrekt und berechnet die Differenz. Da das Ergebnis aber eine Zahl ist und wir das Ergebnis anzeigen lassen möchten, muss es wieder zurückverwandelt werden - diesmal in einen Text:
MessageBox("Hey, du bekommst noch " & _
CStr(CDbl(txtGeld.Text) - 1) & _
" heraus."
Abbildung 1.27
Zu viel Geld wurde eingeworfen.
1.15.1 Vergleiche
 
Neben den mathematischen Funktionen und den Textfunktionen existieren Vergleichsoperatoren und Verknüpfungskonjunktoren:
Zwei Texte oder Zahlen werden mit folgenden Operatoren verglichen:
Tabelle 1.6
Mathematische und logische Verknüpfungen
| Operator
|
Beschreibung
|
| =
|
Gleich
|
| <
|
Kleiner als
|
| >
|
Größer als
|
| <=
|
Kleiner gleich
|
| >=
|
Größer gleich
|
| <>
|
Ungleich
|
| Like
|
Stringvergleich
|
| Is
|
Für Referenztypen, die miteinander verglichen werden. Liefert »Wahr«, wenn eine Referenz auf das gleiche Objekt erfolgt.
|
Der Unterschied bei Vergleichen zwischen »=« und »Like« besteht darin, dass mit »Like« auch »?«, »*« und »#« verwendet werden dürfen. »#« steht für ein beliebiges Zeichen. Beispiele:
»Türkentrunk« = »Türkentrunk«
ergibt »True«.
»Türkentrunk« = »Türköntrünk«
ergibt dagegen »False«. »True« liefern folgende vier Vergleiche:
»Türkentrunk« Like »Tür?entrunk«
»Türkentrunk« Like »Türke*«
»Türkentrunk« Like »?ü*«
»T7« Like »T#«
Ebenso können zwei logische Operatoren miteinander verglichen werden:
Tabelle 1.7
Logische Operatoren
| Operator
|
Beschreibung
|
| Not
|
Negation
|
| And
|
Logisches Und
|
| Or
|
Logisches Oder (das eine oder das andere)
|
| Xor
|
Exklusives Oder (entweder das eine oder das andere)
|
Die Verknüpfungsmöglichkeiten können in einer Tabelle aufgelistet werden:
Tabelle 1.8
Logische Verknüpfungen und ihre Ergebnisse
| Wert 1
|
Wert 2
|
And
|
Or
|
Xor
|
| Wahr
|
Wahr
|
Wahr
|
Wahr
|
Falsch
|
| Wahr
|
Falsch
|
Falsch
|
Wahr
|
Wahr
|
| Falsch
|
Wahr
|
Falsch
|
Wahr
|
Wahr
|
| Falsch
|
Falsch
|
Falsch
|
Falsch
|
Falsch
|
| Wahr
|
Leer
|
Falsch
|
Wahr
|
Wahr
|
| Falsch
|
Leer
|
Falsch
|
Falsch
|
Falsch
|
| Leer
|
Wahr
|
Falsch
|
Wahr
|
Wahr
|
| Leer
|
Falsch
|
Falsch
|
Falsch
|
Falsch
|
|